home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_se / simple_feature_name.e < prev    next >
Text File  |  2000-03-25  |  8KB  |  340 lines

  1. --          This file is part of SmallEiffel The GNU Eiffel Compiler.
  2. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  3. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr
  4. --                       http://SmallEiffel.loria.fr
  5. -- SmallEiffel is  free  software;  you can  redistribute it and/or modify it
  6. -- under the terms of the GNU General Public License as published by the Free
  7. -- Software  Foundation;  either  version  2, or (at your option)  any  later
  8. -- version. SmallEiffel is distributed in the hope that it will be useful,but
  9. -- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. -- or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU General Public License
  11. -- for  more  details.  You  should  have  received a copy of the GNU General
  12. -- Public  License  along  with  SmallEiffel;  see the file COPYING.  If not,
  13. -- write to the  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  14. -- Boston, MA 02111-1307, USA.
  15. --
  16. class SIMPLE_FEATURE_NAME
  17.    --
  18.    -- Is used for simple (not infix or prefix) names of feature in the
  19.    -- declaration part of a feature but is also used when writing an
  20.    -- attribute as a left hand side of an assignment.
  21.    --
  22.  
  23. inherit FEATURE_NAME; EXPRESSION redefine is_writable end;
  24.  
  25. creation make, unknown_position, with
  26.  
  27. feature
  28.  
  29.    start_position: POSITION;
  30.  
  31.    to_string: STRING;
  32.  
  33.    run_feature_2: RUN_FEATURE_2;
  34.          -- The corresponding one when runnable.
  35.  
  36.    is_frozen: BOOLEAN is false;
  37.  
  38.    is_current: BOOLEAN is false;
  39.  
  40.    is_writable: BOOLEAN is true;
  41.  
  42.    use_current: BOOLEAN is true;
  43.  
  44.    stupid_switch(r: ARRAY[RUN_CLASS]): BOOLEAN is
  45.       local
  46.          rf2: RUN_FEATURE_2;
  47.       do
  48.          rf2 := run_feature_2;
  49.          if rf2 /= Void then
  50.             if small_eiffel.same_base_feature(rf2,r) then
  51.                Result := rf2.stupid_switch(r) /= Void;
  52.             end;
  53.          end;
  54.       end;
  55.    
  56.    is_pre_computable: BOOLEAN is false;
  57.  
  58.    isa_dca_inline_argument: INTEGER is 0;
  59.  
  60.    is_static: BOOLEAN is false;
  61.  
  62.    static_result_base_class: BASE_CLASS is    
  63.       local
  64.          bc: BASE_CLASS;
  65.          e_feature: E_FEATURE;
  66.          rt: TYPE;
  67.          cn: CLASS_NAME;
  68.       do
  69.          bc := start_position.base_class;
  70.          if bc /= Void then
  71.             e_feature := bc.e_feature(Current);
  72.             if e_feature /= Void then
  73.                rt := e_feature.result_type;
  74.                if rt /= Void then
  75.                   cn := rt.static_base_class_name;
  76.                   if cn /= Void then
  77.                      Result := cn.base_class;
  78.                   end;
  79.                end;
  80.             end;
  81.          end;
  82.       end;
  83.  
  84.    static_value: INTEGER is
  85.       do
  86.       end;
  87.  
  88.    to_key: STRING is
  89.       do
  90.          Result := to_string;
  91.       end;
  92.  
  93.    result_type: TYPE is
  94.       do
  95.          Result := run_feature_2.result_type;
  96.       end;
  97.  
  98.    can_be_dropped: BOOLEAN is
  99.       do
  100.          eh.add_position(start_position);
  101.          fatal_error("FEATURE_NAME/Should never be called.");
  102.       end;
  103.  
  104.    to_runnable(ct: TYPE): like Current is
  105.       local
  106.          wbc: BASE_CLASS;
  107.          rf: RUN_FEATURE;
  108.          new_name:  FEATURE_NAME;
  109.          rf2: RUN_FEATURE_2;
  110.       do
  111.          wbc := start_position.base_class;
  112.          new_name := ct.base_class.new_name_of(wbc,Current);
  113.          rf := ct.run_class.get_feature(new_name);
  114.          if rf = Void then
  115.             eh.add_feature_name(new_name);
  116.             fatal_error(fz_feature_not_found);
  117.          else
  118.             rf2 ?= rf;
  119.             if rf2 = Void then
  120.                eh.add_position(rf.start_position);
  121.                error(start_position,
  122.                      "Feature found is not writable.");
  123.             end;
  124.          end;
  125.          if run_feature_2 = Void then
  126.             run_feature_2 := rf2;
  127.             Result := Current;
  128.          elseif run_feature_2 = rf then
  129.             Result := Current;
  130.          else
  131.             !!Result.with(Current,rf2);
  132.          end;
  133.       end;
  134.  
  135.    precedence: INTEGER is
  136.       do
  137.          Result := atomic_precedence;
  138.       end;
  139.  
  140.    assertion_check(tag: CHARACTER) is
  141.       do
  142.       end;
  143.  
  144.    dca_inline_argument(formal_arg_type: TYPE) is
  145.       do
  146.       end;
  147.  
  148.    mapping_c_target(target_type: TYPE) is
  149.       local
  150.          flag: BOOLEAN;
  151.       do
  152.          flag := cpp.call_invariant_start(target_type);
  153.          compile_to_c;
  154.          if flag then
  155.             cpp.call_invariant_end;
  156.          end;
  157.       end;
  158.  
  159.    mapping_c_arg(formal_arg_type: TYPE) is
  160.       do
  161.          compile_to_c;
  162.       end;
  163.  
  164.    collect_c_tmp is
  165.       do
  166.       end;
  167.  
  168.    compile_to_c is
  169.       do
  170.          cpp.put_string("(/*SFN*/C->_");
  171.          cpp.put_string(run_feature_2.name.to_string);
  172.          cpp.put_character(')');
  173.       end;
  174.  
  175.    c_declare_for_old is
  176.       do
  177.       end;
  178.  
  179.    compile_to_c_old is
  180.       do
  181.       end;
  182.  
  183.    compile_to_jvm_old is
  184.       do
  185.       end;
  186.  
  187.    print_as_target is
  188.       do
  189.          fmt.put_string(to_string);
  190.          fmt.put_character('.');
  191.       end;
  192.  
  193.    mapping_c_in(str: STRING) is
  194.       do
  195.          str.append(to_string);
  196.       end;
  197.  
  198.    declaration_in(str: STRING) is
  199.       do
  200.          str.append(to_string);
  201.       end;
  202.  
  203.    pretty_print, declaration_pretty_print is
  204.       do
  205.          fmt.put_string(to_string);
  206.       end;
  207.  
  208.    short is
  209.       local
  210.          i: INTEGER;
  211.          c: CHARACTER;
  212.       do
  213.          short_print.hook("Bsfn");
  214.          from
  215.             i := 1;
  216.          until
  217.             i > to_string.count
  218.          loop
  219.             c := to_string.item(i);
  220.             if c = '_' then
  221.                short_print.hook_or("Usfn","_");
  222.             else
  223.                short_print.a_character(c);
  224.             end;
  225.             i := i + 1;
  226.          end;
  227.          short_print.hook("Asfn");
  228.       end;
  229.  
  230.    short_target is
  231.       do
  232.          short;
  233.          short_print.a_dot;
  234.       end;
  235.  
  236.    compile_target_to_jvm, compile_to_jvm is
  237.       do
  238.          eh.add_position(start_position);
  239.          fatal_error(fz_jvm_error);
  240.       end;
  241.  
  242.    jvm_branch_if_false: INTEGER is
  243.       do
  244.          compile_to_jvm;
  245.          Result := code_attribute.opcode_ifeq;
  246.       end;
  247.  
  248.    jvm_branch_if_true: INTEGER is
  249.       do
  250.          compile_to_jvm;
  251.          Result := code_attribute.opcode_ifne;
  252.       end;
  253.  
  254.    compile_to_jvm_into(dest: TYPE): INTEGER is
  255.       do
  256.          Result := standard_compile_to_jvm_into(dest);
  257.       end;
  258.  
  259.    jvm_assign is
  260.       local
  261.          space, idx: INTEGER;
  262.          rf2: like run_feature_2;
  263.          ca: like code_attribute;
  264.       do
  265.          rf2 := run_feature_2;
  266.          ca := code_attribute;
  267.          space := rf2.result_type.jvm_stack_space;
  268.          ca.opcode_aload_0;
  269.          if space = 1 then
  270.             ca.opcode_swap;
  271.          else
  272.             ca.opcode_dup_x2;
  273.             ca.opcode_pop;
  274.          end;
  275.          idx := constant_pool.idx_fieldref(rf2);
  276.          ca.opcode_putfield(idx,-(space + 1));
  277.       end;
  278.  
  279. feature {TYPE_BIT_2}
  280.  
  281.    run_feature(t: TYPE): RUN_FEATURE is
  282.          -- Look for the corresponding runnable feature in `t';
  283.       require
  284.          t.is_run_type
  285.       do
  286.          Result := t.run_class.get_rf_with(Current);
  287.       end;
  288.  
  289.  
  290. feature {BASE_CLASS}
  291.  
  292.    make(n: STRING; sp: like start_position) is
  293.       require
  294.          n.count >= 1;
  295.          n = string_aliaser.item(n)
  296.       do
  297.          to_string := n;
  298.          start_position := sp;
  299.       ensure
  300.          to_string = n;
  301.          start_position = sp
  302.       end;
  303.  
  304. feature {NONE}
  305.  
  306.    unknown_position(n: STRING) is
  307.       require
  308.          n.count >= 1;
  309.          n = string_aliaser.item(n)
  310.       do
  311.          to_string := n;
  312.       ensure
  313.          to_string = n
  314.       end;
  315.  
  316. feature {RUN_FEATURE,FEATURE_NAME}
  317.  
  318.    put_cpp_tag is
  319.       do
  320.       end;
  321.  
  322. feature {NONE}
  323.  
  324.    with(model: like Current; rf2: RUN_FEATURE_2) is
  325.       require
  326.          model /= Void;
  327.          rf2 /= Void
  328.       do
  329.          to_string := model.to_string;
  330.          start_position := model.start_position;
  331.          run_feature_2 := rf2;
  332.       ensure
  333.          to_string = model.to_string;
  334.          start_position = model.start_position;
  335.          run_feature_2 = rf2
  336.       end;
  337.  
  338. end -- SIMPLE_FEATURE_NAME
  339.  
  340.